package cn.song.freight.domain.dto;

import lombok.Data;
import lombok.Builder;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import java.util.List;
import java.util.ArrayList;

/**
 * 按ID获取策略区域定价配置响应DTO
 * 用于返回定价配置的详细信息，包括关联的地区信息
 *
 * @author song
 * @since 2025-08-26
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class GetPricingConfigByIdResponseDTO {

    /**
     * 定价配置ID
     * 唯一标识定价配置的ID
     */
    private Long id;

    /**
     * 策略ID
     * 定价配置所属的策略ID
     */
    private Long strategyId;

    /**
     * 配置名称
     * 定价配置的显示名称
     */
    private String name;

    /**
     * 配置描述
     * 定价配置的详细描述信息
     */
    private String description;

    /**
     * 关联的地区ID列表
     * 当前定价配置关联的所有地区ID集合，用于前端地区信息回显
     */
    private List<Long> areaIds;

    /**
     * 首重重量（kg）
     * 计费的首重重量
     */
    private Double firstWeightKg;

    /**
     * 首重费用（元）
     * 首重重量对应的费用
     */
    private Double firstWeightFee;

    /**
     * 续重重量（kg）
     * 超出首重后每增加的重量单位
     */
    private Double additionalWeightKg;

    /**
     * 续重费用（元）
     * 每个续重重量单位对应的费用
     */
    private Double additionalWeightFee;

    /**
     * 抛重比
     * 体积重量计算比例
     */
    private Double volumetricWeightRatio;


    /**
     * 初始化默认值
     * 在对象创建后调用，设置必要的默认值
     */
    public void init() {
        if (this.areaIds == null) {
            this.areaIds = new ArrayList<>();
        }
    }

    /**
     * 创建时间
     * 配置创建的时间戳
     */
    private String createTime;

    /**
     * 更新时间
     * 配置最后更新的时间戳
     */
    private String updateTime;

    /**
     * 关联地区数量
     * 当前配置关联的地区总数量，用于统计显示
     */
    public Integer getAreaCount() {
        return areaIds != null ? areaIds.size() : 0;
    }

    /**
     * 添加地区ID
     * 便捷方法，用于添加地区ID到关联列表中
     *
     * @param areaId 地区ID
     */
    public void addAreaId(Long areaId) {
        if (this.areaIds == null) {
            this.areaIds = new ArrayList<>();
        }
        if (!this.areaIds.contains(areaId)) {
            this.areaIds.add(areaId);
        }
    }

    /**
     * 设置地区ID列表
     * 便捷方法，用于批量设置地区ID列表
     *
     * @param areaIds 地区ID列表
     */
    public void setAreaIds(List<Long> areaIds) {
        this.areaIds = areaIds != null ? new ArrayList<>(areaIds) : new ArrayList<>();
    }
}
